using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
	#endregion

	public partial class FrmQuanLyNhanVien : Office2007Form
	{
		public FrmQuanLyNhanVien()
		{
			InitializeComponent();
		}

		private void FrmQuanLyNhanVien_Load(object sender, EventArgs e)
		{
			InitGridView();
			LoadData();
            LoadLoaiNhanVien();
			dtgvData.ClearSelection();
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
		}

		private void btnThem_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionAdd())
			{
				MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
				btnReset_Click(sender, e);
			}
			else
			{
				MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnXoa_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
			{
				if (ActionDelete())
				{
					MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					LoadData();
					btnReset_Click(sender, e);
				}
				else
				{
					MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
		}

		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionUpdate())
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
			}
			else
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnThoat_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		private void btnReset_Click(object sender, EventArgs e)
		{
            // Disable btnThem
            btnThem.Enabled = true;
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
            dtgvData.ClearSelection();

			txtMaNhanVien.Text = string.Empty;
			cbxLoaiNhanVien.SelectedIndex = -1;
			txtHoTen.Text = string.Empty;
			dtNgaySinh.Value = DateTime.MinValue;
			txtDiaChi.Text = string.Empty;
			txtSoDienThoai.Text = string.Empty;
			txtGhiChu.Text = string.Empty;
			txtTenDangNhap.Text = string.Empty;
			txtMatKhau.Text = string.Empty;
		}

		private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
				return;

            // Disable btnThem
            btnThem.Enabled = false;
            btnCapNhat.Enabled = true;
            btnXoa.Enabled = true;

			var selectedItem = dtgvData.SelectedRows[0];
			txtMaNhanVien.Text = dtgvData.SelectedRows[0].Cells["MaNhanVien"].Value.ToString();
			var item = NhanVienRepository.SelectByID(int.Parse(txtMaNhanVien.Text));
			LoadDetailInfo(item);
		}

		public void LoadDetailInfo(NhanVien item)
		{
			cbxLoaiNhanVien.SelectedItem = item.LoaiNhanVien == null ? string.Empty : item.LoaiNhanVien.ToString();
			txtHoTen.Text = item.HoTen == null ? string.Empty : item.HoTen.ToString();
			dtNgaySinh.Value = item.NgaySinh == null ? DateTime.MinValue : item.NgaySinh.Value;
			txtDiaChi.Text = item.DiaChi == null ? string.Empty : item.DiaChi.ToString();
			txtSoDienThoai.Text = item.SoDienThoai == null ? string.Empty : item.SoDienThoai.ToString();
			txtGhiChu.Text = item.GhiChu == null ? string.Empty : item.GhiChu.ToString();
			txtTenDangNhap.Text = item.TenDangNhap == null ? string.Empty : item.TenDangNhap.ToString();
			txtMatKhau.Text = item.MatKhau == null ? string.Empty : item.MatKhau.ToString();
		}

		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "MaNhanVien",
				DataPropertyName = "MaNhanVien",
				Name = "MaNhanVien",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "LoaiNhanVien",
				DataPropertyName = "LoaiNhanVien",
				Name = "LoaiNhanVien",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "HoTen",
				DataPropertyName = "HoTen",
				Name = "HoTen",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "NgaySinh",
				DataPropertyName = "NgaySinh",
				Name = "NgaySinh",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "DiaChi",
				DataPropertyName = "DiaChi",
				Name = "DiaChi",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "SoDienThoai",
				DataPropertyName = "SoDienThoai",
				Name = "SoDienThoai",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);
		}


		private void LoadData()
		{
			var lstItem = NhanVienRepository.SelectAll();
			var dt = new DataTable();
			dt.Columns.Add("MaNhanVien");
			dt.Columns.Add("LoaiNhanVien");
			dt.Columns.Add("HoTen");
			dt.Columns.Add("NgaySinh");
			dt.Columns.Add("DiaChi");
			dt.Columns.Add("SoDienThoai");
			for (int i = 0; i < lstItem.Count; i++)
			{
				dt.Rows.Add(lstItem[i].MaNhanVien, lstItem[i].LoaiNhanVien, lstItem[i].HoTen, String.Format("{0:dd/MM/yyyy}", lstItem[i].NgaySinh), lstItem[i].DiaChi, lstItem[i].SoDienThoai);
			}
			DataView objTimeSheetDV = new System.Data.DataView(dt);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

		private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
		{
			if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
			{
				if (txtMaNhanVien.Text == string.Empty)
				{
					errorText = "Vui lòng chọn MaNhanVien";
					return false;
				}
			}
			if (mode != EnumUpdateMode.DELETE)
			{
				if (cbxLoaiNhanVien.SelectedIndex == -1)
				{
					 errorText = "Vui lòng nhập loại nhân viên";
					return false;
				}
				if (txtHoTen.Text == string.Empty)
				{
					 errorText = "Vui lòng nhập họ tên";
					return false;
				}
				if (dtNgaySinh.Value == DateTime.MinValue)
				{
					 errorText = "Vui lòng chọn ngày sinh";
					return false;
				}
				if (txtDiaChi.Text == string.Empty)
				{
					 errorText = "Vui lòng nhập địa chỉ";
					return false;
				}
				if (txtSoDienThoai.Text == string.Empty)
				{
					 errorText = "Vui lòng nhập số điện thoại";
					return false;
				}
			}
			return true;
		}

        private string GenerateTenDangNhap(NhanVien nv)
        {
            if (nv.LoaiNhanVien == StringEnum.GetStringValue(LoaiNhanVien.QUAN_TRI))
                return string.Format("qtv{0}", nv.MaNhanVien);
            else if (nv.LoaiNhanVien == StringEnum.GetStringValue(LoaiNhanVien.NHAN_VIEN))
                return string.Format("nv{0}", nv.MaNhanVien);
            return string.Empty;
        }

		private bool ActionAdd()
		{
			try
			{
				var item = new NhanVien
				{
					LoaiNhanVien = cbxLoaiNhanVien.SelectedItem.ToString(),
					HoTen = txtHoTen.Text,
					NgaySinh = dtNgaySinh.Value,
					DiaChi = txtDiaChi.Text,
					SoDienThoai = txtSoDienThoai.Text,
					GhiChu = txtGhiChu.Text,
				};

				if (!NhanVienRepository.Insert(item))
					return false;

                // Update ten dang nhap
                item.TenDangNhap = GenerateTenDangNhap(item);
                if(!string.Empty.Equals(item.TenDangNhap))
                    item.MatKhau = Encryption.Encrypt("123");// default

                if (!NhanVienRepository.Save())
                    return false;

				return true;
			}
			catch
			{
				return false;
			}
		}

		private bool ActionUpdate()
		{
			try
			{
				var item = NhanVienRepository.SelectByID(int.Parse(txtMaNhanVien.Text));
				item.LoaiNhanVien = cbxLoaiNhanVien.SelectedItem.ToString();
				item.HoTen = txtHoTen.Text;
				item.NgaySinh = dtNgaySinh.Value;
				item.DiaChi = txtDiaChi.Text;
				item.SoDienThoai = txtSoDienThoai.Text;
				item.GhiChu = txtGhiChu.Text;

                if (!string.Empty.Equals(item.TenDangNhap))
                {
                    item.TenDangNhap = txtTenDangNhap.Text;
                    item.MatKhau = txtMatKhau.Text;
                }
                else
                {
                    item.MatKhau = string.Empty;
                }

				return NhanVienRepository.Save();
			}
			catch
			{
				return false;
			}
		}

		private bool ActionDelete()
		{
			try
			{
				return NhanVienRepository.Delete(int.Parse(txtMaNhanVien.Text));
			}
			catch
			{
				return false;
			}
		}

		public void TransferDataInfo(object sender, TransferSimpleDataEvent e)
		{
			this.Close();
		}

        /// <summary>
        /// Load danh sach loai nhan vien
        /// </summary>
        private void LoadLoaiNhanVien()
        {
            cbxLoaiNhanVien.Items.Clear();
            cbxLoaiNhanVien.Items.Add(StringEnum.GetStringValue(LoaiNhanVien.QUAN_TRI));
            cbxLoaiNhanVien.Items.Add(StringEnum.GetStringValue(LoaiNhanVien.NHAN_VIEN));
            cbxLoaiNhanVien.Items.Add(StringEnum.GetStringValue(LoaiNhanVien.TAI_XE));
        }
	}

}
